import { getUserInfo } from '@/store/helper.js'
import {
  useAuthStore,
  usePermissionStore,
  useUserStore,
} from '@/store/index.js'

// 黑名单 个人信息页面等需要登录得页面
const BLACK_LIST = ['/following', '/editor', '/creator/home']

export function createPermissionGuard(router) {
  router.beforeEach(async (to, from) => {
    const authStore = useAuthStore()
    const userStore = useUserStore()
    const permissionStore = usePermissionStore()

    // 检查是否需要登录
    if (BLACK_LIST.includes(to.path) && !authStore.accessToken) {
      window.$message.warning('请先登录')
      if (from.matched.length === 0) {
        return { path: '/', replace: true }
      }
      return false
    }

    // 有token但未获取用户信息
    if (authStore.accessToken && !userStore.userInfo) {
      try {
        const user = await getUserInfo(authStore.accessToken)
        userStore.setUser(user)
      }
      catch (error) {
        console.error('获取用户信息失败:', error)
        // 可以在这里处理获取用户信息失败的情况
        return false
      }
    }
    // 如果是头部重定向的
    if (to.redirectedFrom?.meta.isTop) {
      permissionStore.activeTopMenu = to.redirectedFrom.path
    }

    if (to.meta.isTop) {
      permissionStore.activeTopMenu = to.path
    }
    else if (to.meta.isSideMenu) {
      permissionStore.activeSideMenu = to.path
    }

    // 头部菜单 和 侧边菜单 放入pinia
    if (permissionStore.isMenuInitialized === false) {
      try {
        // 更新菜单
        updateMenuState(router, permissionStore)
        //  标记菜单已初始化
        permissionStore.setMenuInitialized(true)
      }
      catch (error) {
        console.error('初始化菜单失败:', error)
        // 可以在这里处理初始化失败的情况
        return false
      }
    }

    return true
  })

  /**
   * 获取菜单
   * @param {Router} router - Vue Router 实例
   * @param {PermissionStore} permissionStore - 权限存储
   */
  function updateMenuState(router, permissionStore) {
    const routes = router.getRoutes()

    // 头部暂时只有一级
    permissionStore.topMenus = buildRouteTree(
      routes.filter(route => route.meta.show && route.meta.isTop),
    )

    permissionStore.sideMenus = buildRouteTree(
      routes.filter(route => route.meta.show && route.meta.isSideMenu),
    )
  }
}

/**
 * 将扁平路由数组转换为树形结构（处理找不到父级的情况）
 * @param {Array} routes 扁平路由数组
 * @param {object} [options] 配置选项
 * @param {string} [options.parentKey] 父节点标识字段名(位于meta中)
 * @param {string} [options.childrenKey] 子节点字段名
 * @returns {Array} 树形路由结构
 */
function buildRouteTree(routes, options = {}) {
  const { parentKey = 'parentName', childrenKey = 'children' } = options

  // 创建节点映射表
  const routeMap = new Map()
  routes.forEach((route) => {
    route[childrenKey] = []
    routeMap.set(route.name, route)
  })

  // 构建树形结构
  const tree = []
  routes.forEach((route) => {
    const parentName = route.meta?.[parentKey]

    if (!parentName) {
      // 没有父节点的作为根节点
      tree.push(route)
    }
    else if (routeMap.has(parentName)) {
      // 找到父节点并添加到children
      const parent = routeMap.get(parentName)
      parent[childrenKey].push(route)
    }
    else {
      // 有parentName但找不到父级，作为一级路由
      tree.push(route)
    }
  })

  return tree
}
